﻿using MainApp.Views;
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Modularity;
using Rafy;
using Rafy.Book;
using Rafy.Data;
using Rafy.DbMigration;
using Rafy.Domain;
using Rafy.Domain.ORM.DbMigration;
using Rafy.YuWen;
using System;
using System.Windows;

namespace MainApp
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App:PrismApplication
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            Console.WriteLine("1111111");
            //启动领域项目
            new RafyMainApp().Startup();
            base.OnStartup(e);
        }

        /// <summary>
        /// 创建一个页
        /// </summary>
        /// <returns></returns>
        protected override Window CreateShell()
        {
            Console.WriteLine("222222222");
            return Container.Resolve<MainWindow>();
            
        }

        /// <summary>
        /// 使用容器来注册服务的
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //导航页面不要在这里注册，要分别在各个模块中注册
        }
        /// <summary>
        /// 引入模块方法
        /// </summary>
        /// <param name="moduleCatalog"></param>
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            //方法1：代码方法引入使用
            moduleCatalog.AddModule<YuWenModule>();
            moduleCatalog.AddModule<BookModule>();
        }
    }

    class RafyMainApp : DomainApp
    {
        public static bool ForceAllPluginsLoaded = false;
        protected override void InitEnvironment()
        {
            /// 是否启用 Sql 查询监听。 默认为 false。
            /// 打开后，DbAccessed、ThreadDbAccessed 两个事件才会发生。这样才可以监听每一个被执行 Sql。
            /// </ summary >
            DbAccesserInterceptor.ObserveSql = true;

            ///在程序启动时，设置本属性以指示当前程序是否处于调试状态。也可以更改配置文件
            RafyEnvironment.Provider.IsDebuggingEnabled = true;
            DbSettingNames.RafyPlugins = "AiToolConn";

            
            //RafyEnvironment.Plugins.Add(new Rafy.YuWen.YuWenPlugin());
            //RafyEnvironment.Plugins.Add(new Rafy.Book.BookPlugin());
            //RafyEnvironment.Location.DataPortalMode = DataPortalMode.ThroughService;
            base.InitEnvironment();
        }

        protected override void OnRuntimeStarting()
        {
            base.OnRuntimeStarting();

            //生成数据库时，为简单起见，需要先加载所有的插件。
            //注意，此行代码会导致按需加载的单元测试全部通过。
            //所以平时应该通过配置文件来关闭数据库生成功能。
            //使用配置文件加载插件，注意需要引用到启动项目方便加载（如果不引用好像报错）
            RafyEnvironment.EnsureAllPluginsLoaded();
            ForceAllPluginsLoaded = true;
            //AiTools:AutoUpdateDb 这个是指系统配置对
            if (ConfigurationHelper.GetAppSettingOrDefault("AiTools:AutoUpdateDb", true))
            {
                var svc = ServiceFactory.Create<MigrateService>();
                svc.Options = new MigratingOptions
                {
                    ///ReserveHistory = true,//ReserveHistory 表示是否需要保存所有数据库升级的历史记录
                    RunDataLossOperation = DataLossOperation.All,//要禁止数据库表、字段的删除操作，请使用 DataLossOperation.None 值。
                    Databases = new string[] { Rafy.YuWen.YuWenPlugin.DbSettingName }
                };
                svc.Invoke();
            }
        }
    }
}
